package pro.bbs.view.service;

import com.xiaoleilu.hutool.io.IoUtil;
import com.yy.kit.log.YYLogKits;
import com.yy.pojo.image.TImages;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.File;
import java.io.FileNotFoundException;

/**
 * <p>
 * 调用上传及获取图片相关服务接口
 * </p>
 * <描述>
 * Spring Cloud应用在启动时，Feign会扫描标有@FeignClient注解的接口，生成代理，并注册到Spring容器中。
 * 生成代理时Feign会为每个接口方法创建一个RequetTemplate对象，该对象封装了HTTP请求需要的全部信息，
 * 请求参数名、请求方法等信息都是在这个过程中确定的，Feign的模板化就体现在这里。
 * </描述>
 *
 * @author 杨阳
 * @since 2017-09-07
 */
// @FeignClient(value = "images-server") 含义如下：
// 1. images-server为服务提供程序应用的名称， 即 bootstrap.properties中 spring.application.name=images-server
// 2. 并且选择程序，这是一个远程调用接口，不需要实现，只有接口即可注入
@FeignClient(value = "images-server", fallback = IImagesRemoteServiceFallback.class)
// 如果服务端controller上面加了@RequestMapping("/post")，那么这里一样加上
@RequestMapping("/images")
public interface IImagesRemoteService {

    /**
     * <p>
     * 获得图片
     * </p>
     *
     * @param id 图片id
     * @return {@link TImages}
     * @author 杨阳
     * @since 2017年10月16日
     */
    @RequestMapping("/getImage/{id}")
    TImages getImage(@PathVariable("id") String id);

}

/**
 * <p>
 * 图片远程接口失败回调类
 * </p>
 *
 * @author 杨阳
 * @since 2017年11月14日
 */
class IImagesRemoteServiceFallback implements IImagesRemoteService {

    @Override
    public TImages getImage(String id) {
        try {
            //获得classpath下的默认图片
            File imgFile = ResourceUtils.getFile("classpath:static/images/default/user_default.png");
            byte[] imgByte = IoUtil.readBytes(IoUtil.toStream(imgFile));
            TImages img = new TImages();
            img.setImage(imgByte);
            return img;
        } catch (FileNotFoundException e) {
            YYLogKits.error(this.getClass(), "没有获取到classpath:static/images/default/user_default.png文件!");
            e.printStackTrace();
        }
        return null;
    }
}
